/** Clase para realizar SETs **/

package common;

import java.io.IOException;

import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.*;
import org.snmp4j.smi.*;

public class Set {

    private Snmp snmp; //objeto para la comunicacion SNMP

    SesionSNMP sesion; //sesion para la escritura

    /* Constructor */
    public Set(SesionSNMP sesion) {
	this.sesion = sesion;
        snmp = sesion.getSnmp();
    }

    /* Establecer valores a los OIDs indicados  */
    public int set(OID [] oidArray, Variable [] values) throws IOException {

        // Comprobar pares OID-Valor
        if (oidArray.length != values.length){
            return -1;
        }
        // Enviar mensaje y recoger respuesta
	ResponseEvent event = getResponse(oidArray, values);
        PDU responsePDU = event.getResponse();
        int errorStatus = responsePDU.getErrorStatus();
        if (errorStatus != PDU.noError){ //si error en el SET
            return -2;
        }
        // Si no hay error, retorna 0
	return 0;
        
    } //setObject

    /* Enviar la peticion */
    private ResponseEvent getResponse(OID oids[], Variable[] values) throws IOException {

        // Crear la PDU con los OIDs
	PDU pdu = new PDU();
 	for (int i = 0; i<oids.length;i++) {
 	     pdu.add(new VariableBinding(oids[i],values[i]));
 	}
 	pdu.setType(PDU.SET);

        // Enviar el mensaje de configuracion
 	ResponseEvent event = snmp.send(pdu, sesion.getTarget(), null);
	if(event != null) {
             return event;
	}
	throw new RuntimeException("SET timed out");
        
    } //getResponse

} //class